/*
	以下定义适用于 ARM Cortex-M 
*/

#ifndef _TYPEDEF_H_
#define _TYPEDEF_H_

#include <stdint.h>	// ARMCLANG 编译器库文件
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

typedef unsigned char  			byte;
typedef unsigned char  			u8;
typedef uint16_t  			    u16;
typedef uint32_t  			    u32;

typedef signed char  			s8;
typedef int16_t  			    s16;
typedef int32_t  			    s32;

typedef volatile unsigned char  vu8;
typedef volatile uint16_t 	    vu16;
typedef volatile uint32_t 	    vu32;

typedef volatile signed char  	vs8;
typedef volatile int16_t  		vs16;
typedef volatile int32_t  	    vs32;


//非51内核定义以下以关键字兼容51代码

    // #define data
    #define idata 
    #define pdata 
    #define xdata     
	// #define code
	#define C51_CODE
    #define bit   bool



//非STM8_IAR单片机定义以下关键字兼容STM8代码

    #define     __far
    #define     __near 
    // #define     __no_init
    #define     __eeprom




/* Compiler Related Definitions */
// 在 c_cpp_properties.json 中添加 "intelliSenseMode": "windows-clang-arm" 可解决 vscode 中 __attribute__ 报错问题（或者通过UI配置添加）。
#include <stdarg.h>
#ifndef SECTION
#define SECTION(x)               __attribute__((section(x)))
#endif
#ifndef __UNUSED
#define __UNUSED                   __attribute__((unused))
#endif
#ifndef USED
#define USED                     __attribute__((used))
#endif
#ifndef ALIGN
#define ALIGN(n)                 __attribute__((aligned(n)))
#endif
#ifndef WEAK
#define WEAK                     __attribute__((weak))
#endif

#define UNUSED(X) (void)X 

#define IN_LINE					__inline
#define FORCE_IN_LINE			__attribute__((always_inline)) __inline
#define STATIC_IN_LINE			static __inline
#define STATIC_FORCE_IN_LINE   	__attribute__((always_inline)) static __inline
/*
	这里有一个疑问 inline 、 __inline( = __INLINE) 都能编译通过, __forceinline 、 __attribute__((always_inline)) 也都能编译通过
	*/

#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#ifndef __CLANG_ARM
#define __CLANG_ARM
#endif
#define __align(n)	ALIGN(n)
#define __current_pc()                                                         \
  __extension__({                                                              \
    register unsigned int current_pc;                                          \
    __asm__ __volatile__("mov %0, pc" : "=r"(current_pc) : : );                \
    current_pc;                                                                \
  })

#define __current_sp()                                                         \
  __extension__({                                                              \
    register unsigned int current_sp;                                          \
    __asm__ __volatile__("mov %0, sp" : "=r"(current_sp) : : );                \
    current_sp;                                                                \
  })
#define NO_INIT         __attribute__((section("NoInit")))
#else
#define NO_INIT         __attribute__((section("NoInit"), zero_init))
#endif
/*
NO_INIT 使用条件：在分散加载文件中添加 NoInit section 并处于 UNINIT 标记的RAM区域中，例如：
LR_IROM1 0x00000000 0x0000F800  {    ; load region size_region
  ER_IROM1 0x00000000 0x0000F800  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00001FE0  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x20001FE0 UNINIT 0x00000020  {  ; NoInit Section
   *(NoInit)
  }
}
还要确保在运行本程序之前的BootLoader程序不会清零该地址范围。
*/

typedef struct _tm
{
	u8 Second;
	u8 Minute;
	u8 Hour;
	u8 Day;
	u8 Week;
	u8 Month;
	u8 Year;
	u8 Zone;
}tm_t;


#endif
